#ifndef RSUMGR
#define RSUMGR

#include <QObject>
#include <QMap>
#include "rsuctrl.h"

class RsuMgr : public QObject
{
    Q_OBJECT
public:
    static RsuMgr* s_pInstance;
    static RsuMgr* getInstance();

public:
    // 申请一个新的设备
    bool setDevType(int nIndex);
    void releaseDev(int nIndex);
    /*!
     * \brief 设置天线连接参数，打开天线
     * \param host: 天线IP地址
     * \param port: 天线服务监听端口
     */
    bool openRsu(int nIndex,const QString &host, quint16 port);
    /*!
     * \brief 打开天线
     */
    bool reopenRsu(int nIndex);
    bool closeRsu(int nIndex);

    // 天线初始化
    int initRsu(int nIndex,int nBSTInterval, int nTxPower, int nPLLChannelID);
    // 获取 天线信息
    int getRsuInfo(int nIndex);
    // 发射bst帧
    int detectObu(int nIndex);
    // 检查天线状态
    bool checkRsuStatus(int nIndex);
    // 重新连接天线
    bool tryReconnect(int nIndex);
    // 设置心跳方式,及心跳间隔
    void setConfigHeartBeat(int nIndex,int nStyle,int nInterval);
    /*!
     * \brief 开始检测OBU
     * 当车道端发送bst信息,天线开始广播,一段时间后,
     * 会返回vst,可能是天线检测到OBU返回,也可能返回的是默认帧
     * 这时天线不会有检测OBU的功能,
     * 只有车道端不断的定时发送bst信息,天线才具备该项功能
     * \param nInterval: 检测间隔，单位为毫秒
     */
    bool startDetectObu(int nIndex,int nInterval);
    /*!
     * \brief 停止检测OBU
     */
    bool stopDetectObu(int nIndex);
    // 该函数不好使,具体原因崔总也不是很清楚
    void releaseObu(int nIndex);
    // 该值搭配 releaseobu 函数使用 也不好使
    void setBeaconChangeInterval(int nIndex,int nInterval);

signals:
    // 新的数据到达
    void newFrameArrived(int index,quint8 nFrameIndex, quint8 nFrameType, const QByteArray &frame);
    // RSU信息初始化
    void rsuInited(int index,int nRsuStatus, const QByteArray &baRsuInfo);
    // 获取RSU信息
    void rsuInfoGot(int index,const QByteArray &baRsuInfo);
    // 检测到OBU信息
//    void obuDetected(int index,ObuInfo newObu, IccInfo newIcc);
    void obuDetected(int index,ObuInfo newObu);
    // 天线状态改变
    void statusChanged(int index,int status);
private:
    RsuCtrl* getRsuDev(int nIndex);
private slots:
    void emitNewFramArrived(quint8 nFrameIndex, quint8 nFrameType,const QByteArray &frame);
    void emitRsuInited(int nRsuStatus,const QByteArray &baRsuInfo);
    void emitRsuInfoGot(const QByteArray &baRsuInfo);
//    void emitObuDetected(ObuInfo newObu, IccInfo newIcc);
    void emitObuDetected(ObuInfo newObu);
    void emitStatusChanged(int status);
private:
    RsuMgr(QObject * parent = 0);
private:
    QMap<int,RsuCtrl *> m_RsuMap;
};

#endif // RSUMGR

